/*********************************************************
 **                                                      *
 ** Nombre: GestorDeRelacionAlumnoProgramaEducativo.java *            
 ** Versión: 1.0.0                                       *
 ** Autor: Alonso Fabian Orozco Perez                    *
 ** Creado: 13-Mar-2013                                  *
 ** Modificado:                                          *
 ** Diagrama: GPI v2.1.3                                 *
 ** Caso de uso: MCAAL4, MCAAl5                          * 
 ********************************************************/
package Servicios;

import DAO.DAOAsignaturasAlumno;
import DAO.DAOAsignaturasOptativasAlumno;
import DAO.DAOInformacionAlumno;
import DAO.DAORelacionAlumnoProgramaEducativo;
import DAO.DAORespuestasEDD;
import Dominio.ProgramaEducativo;
import Dominio.Semestre;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servicios de gestión de información relativa al programa educativo de los alumnos.
 * @author amado.cante
 */
public class GestorDeRelacionAlumnoProgramaEducativo extends HttpServlet {

    /**
     * Processes requests for both HTTP
     * <code>GET</code> and
     * <code>POST</code> methods.
     * Determina la petición solicitada y redirige al método que procesa dicha petición.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        String operacion = request.getParameter("operacion");
        PrintWriter out = response.getWriter();
        
        if(operacion != null) {
        
            if (operacion.equalsIgnoreCase("modificarPEConClaveActual")) {
                modificaPE(request, response);
            } else {
                if (operacion.equalsIgnoreCase("modificarPEConClaveNueva")) {
                    modificarPEClaveNueva(request,response);
                } else {
                    if (operacion.equalsIgnoreCase("mostrarCambioPE")) {
                        mostrarFormularioCambioPE(request, response);
                    } else {
                        String resp = "El servicio solicitado no existe.";
                        out.println(resp);
                    }
                }
            }
        }
        else {
            out.println("Ocurrio un problema al procesar la peticion");
        }
        
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP
     * <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP
     * <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

    /**
     * Procesa la modificación del programa educativo seleccionado por el alumno.
     * @param request - petición
     * @param response - respuesta
     */
    private void modificaPE(HttpServletRequest request, HttpServletResponse response) {
        try {
           PrintWriter out = null;
           HttpSession sessionOk = request.getSession();
           String nombreUsuarioAlumno = sessionOk.getAttribute("nombreUsuario").toString();
           sessionOk.setAttribute("asignaturas", null);
           
           DAORespuestasEDD daoRespuestasEDD = new DAORespuestasEDD();
           daoRespuestasEDD.eliminarRespuestasEDDDeAlumno(nombreUsuarioAlumno); 
           daoRespuestasEDD.cerrarConexionARespuestasEHE();
           
           String clavePEActual = request.getParameter("clavePE");
           String semestre = request.getParameter("semestre");
           int numSemestre = Integer.parseInt(semestre);
           int clvPE = Integer.parseInt(clavePEActual);
           out = response.getWriter();
           DAOAsignaturasOptativasAlumno daoOPTAlumno = new DAOAsignaturasOptativasAlumno();
           DAOAsignaturasAlumno daoAsigAlumno = new DAOAsignaturasAlumno();
           DAORelacionAlumnoProgramaEducativo daoRelAlumnoPE = new DAORelacionAlumnoProgramaEducativo();
           DAOInformacionAlumno daoInfoAlumno = new DAOInformacionAlumno();
           int claveInfoAlumno = daoInfoAlumno.obtenerClaveInfoAlumno(nombreUsuarioAlumno);
           int clvRelAlumnoPE = daoRelAlumnoPE.obtenerClaveRelacion(claveInfoAlumno, clvPE);
           //eliminamos de la tabla de asignaturas alumno
           daoAsigAlumno.eliminarAsignaturasDelAlumno(clvRelAlumnoPE);
           //ahora eliminamos de la tabla asignaturas optativas del alumno
           daoOPTAlumno.eliminarAsignaturasDelAlumno(clvRelAlumnoPE);
           // ahora elimino la relacion alumno PE
           daoRelAlumnoPE.actualizarRelacionAlumnoPE(clvPE,numSemestre);
           out.println("Se ha actualizado correctamente el programa educativo. <input type = 'button' value='Regresar' id='regresar'>");
        } catch (IOException ex) {
            Logger.getLogger(GestorDeRelacionAlumnoProgramaEducativo.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * Método para responder la petición por ajax de mostrar el formulario de cambio de programa educativo del alumno.
     * @param request - petición
     * @param response - respuesta
     */
    private void mostrarFormularioCambioPE(HttpServletRequest request, HttpServletResponse response) {
        try {
            PrintWriter out = null;
            HttpSession sessionOk = request.getSession();
            String nombreUsuarioAlumno = sessionOk.getAttribute("nombreUsuario").toString();
            DAOInformacionAlumno daoInfoAlumno = new DAOInformacionAlumno();
            int claveInfoAlumno = daoInfoAlumno.obtenerClaveInfoAlumno(nombreUsuarioAlumno);
            DAORelacionAlumnoProgramaEducativo daoRelAlumnoPE = new DAORelacionAlumnoProgramaEducativo();
            int clavePE = daoRelAlumnoPE.obtenerClavePE(claveInfoAlumno);
            int claveRelacionAlumnoPE = daoRelAlumnoPE.obtenerClaveRelacion(claveInfoAlumno, clavePE);
            int claveSemestre = daoRelAlumnoPE.obtenerClaveDeSemestreDelAlumno(claveRelacionAlumnoPE);
            
            out = response.getWriter();
            DAO.DAOProgramaEducativo daope = new DAO.DAOProgramaEducativo();
            String nombrePE = daope.obtenerabreviaturaDePE(clavePE);
            ArrayList<ProgramaEducativo> programas = daope.listarProgramas();
            String respuesta = "<div class=\"contenedorFormularioRegistroAlumno\">"
                    + "<h3>Cambio de programa educativo y semestre</h3>"
                    + "<table>"
                    + "<tr>"
                    + "                <td>Programa Educativo:</td>"
                    + "                <td><select name=\"cmbProgramaE\" id=\"cmbProgramaE\" onchange=\"actualizarListaSemestres(this.options[this.selectedIndex].value);\">"
                    + "                        <option value=" + clavePE + ">" + nombrePE + "</option>";                   
           
            for (int i = 0; i < programas.size(); i++) {
                String valor = String.valueOf(programas.get(i).getCvePrograma());
                String nombre = programas.get(i).getNombre();
                
                if(!nombrePE.equals(nombre)) {
                    respuesta += " \"<option value='" + valor + "'>" + nombre + "</option>\"";
                }
            }

            respuesta += "                    </select>"
                    + "                </td>"
                    + "            </tr> "
                    + "<tr id=\"filaSemestre\">" 
                    + "<td>Seleccione su semestre:</td><td><select name='semestre' id='semestre'><option value='-1'>Seleccione</option>";
                    
                    ProgramaEducativo programaEducativo = daope.buscarPrograma(clavePE);
                    ArrayList<Semestre> listaSemestres = programaEducativo.getReticula().getListaDeSemestres();
                   
                    for (int i = 0; i < listaSemestres.size(); i++) {
                        int claveSemestreDeLista = listaSemestres.get(i).getClaveSemestre();
                        int numeroSemestre = listaSemestres.get(i).getNumeroDeSemestre();

                        if(claveSemestre == claveSemestreDeLista) {
                            respuesta += "<option value='"+claveSemestreDeLista+"' selected>" + "Semestre " + numeroSemestre + "</option>";
                        } else {
                            respuesta += "<option value='"+claveSemestreDeLista+"'>" + "Semestre " + numeroSemestre + "</option>";
                        }
                    }
                    
                    respuesta += "</select></td>"
                    + "</tr>"
                    + "<tr>"
                    + "<td> <input type = 'button' value = 'Guardar Cambios' id = 'guardarPE'>"
                    + "</td>"
                    + "<td> <input type = 'button' value = 'Regresar' id = 'regresar'>"
                    + "</td>"
                    + "</tr>"
                    + "</table>"
                    + "</div>";
                                                       
            out.println(respuesta);            
        } catch (IOException ex) {
            Logger.getLogger(GestorDeRelacionAlumnoProgramaEducativo.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    /**
     * Método para procesar el cambio de programa educativo del alumno.
     * @param request - petición
     * @param response - respuesta
     */
    private void modificarPEClaveNueva(HttpServletRequest request, HttpServletResponse response) {
        try {
            PrintWriter out = null;
            HttpSession sessionOk = request.getSession();
            String nombreUsuarioAlumno = sessionOk.getAttribute("nombreUsuario").toString();
            sessionOk.setAttribute("asignaturas", null);
            
            DAORespuestasEDD daoRespuestasEDD = new DAORespuestasEDD();
            daoRespuestasEDD.eliminarRespuestasEDDDeAlumno(nombreUsuarioAlumno); 
            daoRespuestasEDD.cerrarConexionARespuestasEHE();
            
            String clavePEActual = request.getParameter("clavePEActual");
            String clavePENueva = request.getParameter("clavePENueva");
            String semestre = request.getParameter("semestre");
            int clvPEActual = Integer.parseInt(clavePEActual);
            int clvPENueva = Integer.parseInt(clavePENueva);
            int numSemestre = Integer.parseInt(semestre);
            out = response.getWriter();
            DAOAsignaturasOptativasAlumno daoOPTAlumno = new DAOAsignaturasOptativasAlumno();
            DAOAsignaturasAlumno daoAsigAlumno = new DAOAsignaturasAlumno();
            DAORelacionAlumnoProgramaEducativo daoRelAlumnoPE = new DAORelacionAlumnoProgramaEducativo();
            DAOInformacionAlumno daoInfoAlumno = new DAOInformacionAlumno();
            int claveInfoAlumno = daoInfoAlumno.obtenerClaveInfoAlumno(nombreUsuarioAlumno);
            int clvRelAlumnoPE = daoRelAlumnoPE.obtenerClaveRelacion(claveInfoAlumno, clvPEActual);
            //eliminamos de la tabla de asignaturas alumno
            daoAsigAlumno.eliminarAsignaturasDelAlumno(clvRelAlumnoPE);
            //ahora eliminamos de la tabla asignaturas optativas del alumno
            daoOPTAlumno.eliminarAsignaturasDelAlumno(clvRelAlumnoPE);
            // ahora actualizo la relacion alumno PE
            daoRelAlumnoPE.actualizarRelacionAlumnoPE(clvPEActual,clvPENueva,numSemestre);
            out.println("Se ha actualizado correctamente el programa educativo. <input type = 'button' value='Regresar' id='regresar'>");
        } catch (IOException ex) {
            Logger.getLogger(GestorDeRelacionAlumnoProgramaEducativo.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
